package br.com.rhinovet.listener;

import java.io.IOException;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;

import br.com.rhinovet.faces.LoginFaces;
import br.com.rhinovet.util.StringUtil;

public class RhinoVetListener implements PhaseListener {
private static final long serialVersionUID = 1L;
	
	private static final String paginaLogin = "login.xhtml";
	private static final String chaveSessao = "SESSAO_INVALIDA";
	
	@SuppressWarnings("static-access")
	@Override
	public void afterPhase(PhaseEvent event) {
		FacesContext context = event.getFacesContext();
		
		if (context.getViewRoot() == null) {
		} else if (!context.getViewRoot().getViewId().contains(paginaLogin)) {
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
					.getExternalContext().getSession(false);
			
			Map<String, Object> mapSessao = context.getExternalContext().getSessionMap();
			
			
			if (session == null) {
				mapSessao.put(chaveSessao, "Sess�o expirada!");
				this.redirecionarPagina(paginaLogin);
			} else {
				Object atributo = session.getAttribute("loginFaces");
				if (atributo != null && (atributo instanceof LoginFaces)) {
					LoginFaces login = (LoginFaces) atributo;
					//TODO - VERIFICAR COM O GILSON AS FORMAS DE IMPEDIR QUE O MESMO USUARIO SEJA LOGADO EM VÁRIOS LUGARES
					if (login.getSession() == null) {
						mapSessao.put(chaveSessao, "Sess�o expirada!");
						this.redirecionarPagina(paginaLogin);
					}
				} else {
					mapSessao.put(chaveSessao, "Sess�o expirada!");
					this.redirecionarPagina(paginaLogin);
				}
			}
		} else {
			this.recuperarMensagemSessao(context);
		}
	}

	@Override
	public void beforePhase(PhaseEvent event) {
	}

	@Override
	public PhaseId getPhaseId() {
		return PhaseId.RESTORE_VIEW;
	}
	
	private void redirecionarPagina(String paginaDestino) {
		try {
			ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
			context.redirect(context.getRequestContextPath() + "/" + paginaLogin);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void recuperarMensagemSessao(final FacesContext facesContext) {
		Map<String, Object> mapSessao = facesContext.getExternalContext().getSessionMap();
		if (mapSessao.get(chaveSessao) != null) {
			String mensagem = (String) mapSessao.remove(chaveSessao);
			if (StringUtil.textoPreenchido(mensagem)) {
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, mensagem, mensagem));
			}
		}
	}
}